package com.tools.web.interceptor.auth;

import com.tools.common.object.Note;
import com.tools.common.thread.TimePair;
import com.tools.common.thread.Timeunit;
import com.tools.web.http.HttpDataFromEnum;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

/**
 * 用户认证拦截器接口
 * */
@Note("用户认证拦截器接口")
public interface AuthenticationManager extends HandlerInterceptor {

    @Note("封装好的 AuthUser 对象存储在 attribute 里的名称")
    String AUTH_USER_NAME = "authUser";

    @Note("解密加密的 token 字符串为 AuthToken 实例")
    AuthToken decryptAuthToken(String encryptedToken);

    @Note("生成一个空的 AuthToken 的实现类实例")
    AuthToken newEmptyAuthToken();

    @Note("获取子类使用的时间单位")
    Timeunit getTimeunitUsedBySubclass();

    @Note("获取缓存 AuthUser 实例对象的 key")
    String getAuthUserSaveKey(AuthToken decryptedToken);

    String getAuthUserSaveKey(Object userId, String loginUserType);

    @Note("单用户多记录在线时的 AuthUser 缓存 key")
    String getMultipleAuthUserSaveKey(String sourceKey);

    @Note("单用户的某个设备的登录记录的前缀")
    String getMultipleDeviceSavePrefix(String sourceKey, String loginDeviceType);

    @Note("单用户多记录在线时的 token 记录的缓存 key")
    String getMultipleLoginRecordSaveKey(String sourceKey, String loginDeviceType,
                                         String uuid);

    AuthUserService getAuthUserService();

    AuthTokenExtender getAuthTokenExtender();

    boolean isRefreshTokenExtender();

    HttpDataFromEnum getTokenIn();

    String getTokenName();

    Object getDisabledPlatformId();

    @Note("设备的类型-该设备最多允许多少条登录记录同时在线")
    Map<String, Integer> getLoginDeviceTypeAndMaxOnlineTotal();

    @Note("登录操作的逻辑")
    void handleLogin(Object userId, String loginUserType, String loginDeviceType, Object user,
                     long expiration, Timeunit timeunit, HttpServletRequest request,
                     HttpServletResponse response);

    @Note("登录操作的逻辑")
    void handleLogin(Object userId, String loginUserType, String loginDeviceType, Object user,
                     TimePair expiration, HttpServletRequest request,
                     HttpServletResponse response);

    @Note("封禁用户操作")
    void handleDisable(HttpServletRequest request);

    @Note("退出登录的操作")
    void handleLoginOut(HttpServletRequest request);

    @Note("更新 “用户数据/角色/权限/路由/自定义数据” 等操作时的后续同步更新操作")
    void handleUpdate(Object userId, String loginUserType, String loginDeviceType);

    @Note("更新 “用户数据/角色/权限/路由/自定义数据” 等操作时的后续同步更新操作")
    void handleUpdate(AuthUser newAuthUser);
}
